#pragma once

#include <AVUIDependencyObject.h>
#include <AVUIMatrix3DStack.h>

namespace AVUI {

class GeometryModel3D;
class Transform3D;
class Model3D;

class HitTestParameters3D : public Object
{
public:
    DECLARE_ELEMENT(HitTestParameters3D, Object);
#pragma region Internal Methods

    HitTestParameters3D();

    void PopTransform(Transform3D* pTransform);
    void PushModelTransform(Transform3D* pTransform);
    void PushVisualTransform(Transform3D* pTransform);

#pragma endregion Internal Methods

#pragma region Internal Properties

    bool get_HasHitTestProjectionMatrix();
    bool get_HasModelTransformMatrix();
    bool get_HasWorldTransformMatrix();

    Matrix3D get_HitTestProjectionMatrix();
    void set_HitTestProjectionMatrix(const Matrix3D& value);

    Matrix3D get_ModelTransformMatrix();
    Matrix3D get_WorldTransformMatrix();

#pragma endregion Internal Properties

#pragma region Internal Fields

    TRefCountedPtr<GeometryModel3D> CurrentGeometry;
    TRefCountedPtr<Model3D> CurrentModel;
    TRefCountedPtr<Visual3D> CurrentVisual;

#pragma endregion Internal Fields

private:

#pragma region Private Fields

    Nullable<Matrix3D> m_hitTestProjectionMatrix;
    Matrix3DStack m_modelTransformStack;
    Matrix3DStack m_visualTransformStack;

#pragma endregion Private Fields

};

}; // namespace AVUI


